<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

namespace Addons\Attachment\Model;
use Think\Model;

/**
 * 附件模型
 */
class AttachmentModel extends Model {
	/**
	 * 附件模型自动完成
	 * @var array
	 */
	protected $_auto = array(
		array('uid', 'session', self::MODEL_INSERT, 'function', 'user_auth.uid'),
		array('download', 0, self::MODEL_INSERT),
		array('sort', 0, self::MODEL_INSERT),
		array('create_time', NOW_TIME, self::MODEL_INSERT),
		array('update_time', NOW_TIME, self::MODEL_BOTH),
		array('status', 1, self::MODEL_BOTH),
	);

	protected function _after_find(&$result, $options) {
		$result['update_time_text'] = date('Y-m-d H:i:s', $result['update_time']);
		$result['document_title'] = D('Document')->getFieldById($result['record_id'], 'title');
		$result['size'] = format_bytes($result['size']);
	}

	protected function _after_select(&$result, $options) {
		foreach ($result as &$record) {
			$this->_after_find($record, $options);
		}
	}

	/**
	 * 保存文件附件到数据库
	 * @param  string  $title  附件标题
	 * @param  array   $file   文件数据
	 * @param  number  $record 关联记录ID
	 * @param  integer $dir    是否为目录
	 * @return boolean
	 */
	public function saveFile($title, $file, $record, $dir = 0) {
		$data = array(
			'title' => $title,
			'type' => 2,
			'source' => $file['id'],
			'record_id' => $record,
			'dir' => $dir,
			'size' => $file['size'],
		);

		/* 保存附件 */
		if ($this->create($data) && $this->add()) {
			return true;
		} else {
			return false;
		}
	}

	public function saveDir() {

	}

	/**
	 * 下载附件
	 * @param  number $id 附件ID
	 * @return boolean    下载失败返回false
	 */
	public function download($id) {
		$info = $this->field(true)->find($id);
		if ($info && $info['status'] == 1) {
			/* 下载附件 */
			$this->downloadId = $id;
			switch ($info['type']) {
			case 0:
				//TODO: 下载目录？
				break;
			case 1:
				//TODO: 下载外部附件
				break;
			case 2:
				$File = D('File');
				$root = C('ATTACHMENT_UPLOAD.rootPath');
				$call = array($this, 'setDownload');
				if (false === $File->download($root, $info['source'], $call, $id)) {
					$this->error = $File->getError();
				} else {
					return true;
				}
				break;
			default:
				$this->error = '无效附件类型！';
			}
		} else {
			$this->error = '附件已删除或被禁用！';
		}
		return false;
	}

	/**
	 * 新增下载次数（File模型回调方法）
	 */
	public function setDownload($id) {
		$map = array('id' => $id);
		$this->where($map)->setInc('download');
	}

}